#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <bitset>
#include <utility>
using namespace std;

#define mm(a, n) memset(a, n, sizeof a)
#define mk(a, b) make_pair(a, b)

const double eps = 1e-6;
const int INF = 0x3f3f3f3f;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<LL, LL> PLL;
typedef pair<int, LL> PIL;

inline void quickread() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

const int N = 1e4 + 10;

bool p[N]; // 存放素数
vector<int> prime; // 将素数全部放在一起方便二分
int n, m;

bool isPrime (int n) {
    return !p[n];
}

// 正增量的二次探测法来解决冲突。
inline void solution() {

    // 打表算素数
    for (int i = 2; i < N; i ++ ) {
        if (p[i]) continue;
        for (int k = 2; i * k < N; k ++) p[i * k] = true;
    }

    for (int i = 2; i <= N; i ++ ) 
        if (isPrime(i))
            prime.push_back(i);
    
    cin >> n >> m;

    auto it = lower_bound(prime.begin(), prime.end(), n);
    int size = *it;

    unordered_set<int> st;

    for (int i = 0; i < m; i ++ ) {
        int num;
        cin >> num;
        int idx = num % size;
        if (st.count(idx)) {
            int temp = idx;
            int j;
            for (j = 0; j < size; j ++ ) {
                temp = (idx + j * j) % size;
                if (st.count(temp)) 
                    continue;
                cout << " " << temp;
                st.insert(temp);
                break;
            }
            if (j >= size) 
                cout << " -";
        } else {
            if (!i)
                cout << idx;
            else 
                cout << " " << idx;
            st.insert(idx);
        }
    }
    cout << endl;
    
}

int main() {
    freopen("input.txt", "r", stdin);
    quickread();
    solution();
    return 0;
}